package com.qsmx.core.util.aes;

import java.util.Base64;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class AESUtil {

    // 算法模式和填充
    private static final String ALGORITHM = "AES/CBC/PKCS5Padding";

    // 16 字节的密钥和 IV (示例密钥和 IV，实际使用时应使用安全的密钥和 IV)
    private static final byte[] KEY = "5EI4vyZLVoIcFnnm".getBytes();  // 16 字节密钥
    private static final byte[] IV = "5EI4vyZLVoIcFnnm".getBytes();   // 16 字节 IV

    /**
     * 加密方法
     * @param plainText 明文
     * @return 加密后的 Base64 编码字符串
     * @throws Exception 如果加密失败
     */
    public static String encrypt(String plainText) throws Exception {
        // 创建 Cipher 实例
        Cipher cipher = Cipher.getInstance(ALGORITHM);

        // 创建密钥和 IV 的规格
        SecretKeySpec keySpec = new SecretKeySpec(KEY, "AES");
        IvParameterSpec ivSpec = new IvParameterSpec(IV);

        // 初始化 Cipher 实例为加密模式
        cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);

        // 执行加密
        byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());

        // 返回 Base64 编码的加密数据
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    /**
     * 解密方法
     * @param encryptedText 加密后的 Base64 编码字符串
     * @return 解密后的明文
     * @throws Exception 如果解密失败
     */
    public static String decrypt(String encryptedText) throws Exception {
        // 创建 Cipher 实例
        Cipher cipher = Cipher.getInstance(ALGORITHM);

        // 创建密钥和 IV 的规格
        SecretKeySpec keySpec = new SecretKeySpec(KEY, "AES");
        IvParameterSpec ivSpec = new IvParameterSpec(IV);

        // 初始化 Cipher 实例为解密模式
        cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);

        // 解码 Base64 编码的加密数据
        byte[] decodedBytes = Base64.getDecoder().decode(encryptedText);

        // 执行解密
        byte[] decryptedBytes = cipher.doFinal(decodedBytes);

        // 返回解密后的明文
        return new String(decryptedBytes);
    }

    public static void main(String[] args) {
        try {
            String originalText = "{\"deviceId\": \"p8kqDHSmD3DU9aKoPKevww==\",\"meetingDate\": \"2024-10-18\"}";
            String encryptedText = encrypt(originalText);
            String decryptedText = decrypt(encryptedText);

            System.out.println("Original Text: " + originalText);
            System.out.println("Encrypted Text: " + encryptedText);
            System.out.println("Decrypted Text: " + decryptedText);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
